# 将上周1.10的综合案例《在线学生信息管理》改成数据库操作版的。
# 1）编写stu表信息操作类：内有方法：构造方法实现数据库连接；析构方法关闭数据连接；
# findAll( )--查询方法 、del（id）-- 删除方法 insert（data）--添加方法
# 2）使用使用上面自定义stu表操作类，结合1.10的综合案例，做出增，删，查询操作。
# 第二周作业3
# 班级：Python五期
# 学员：李子坚

#导入pymsql模块
import pymysql

# 定义一个学生信息类
class Stu_Info:
    # 构造函数，创建数据库连接
    def __init__(self):
        self.db = pymysql.connect(host="localhost",user="root",password="",db="mydb",charset="utf8")
        self.cursor = self.db.cursor()

    # 析构函数，关闭数据库连接
    def __del__(self):
        self.cursor.close()
        self.db.close()

    # 查询并输出所有学生信息
    def findAll(self):
        # 查询学生信息SQL语句
        sql = "select * from stu order by id"

        try:
            #执行查询学生信息SQL语句
            self.cursor.execute(sql)

            if self.cursor.rowcount ==0:
                print("=============== 没有学生信息可以输出！===============")
            else:
                print("+{0:<6}+ {1:<15}+ {2:<6}+ {3:<6}+ {4:<15}+".format("-"*6,"-"*15,"-"*6,"-"*6,"-"*15))
                print("|{0:<6}| {1:<15}| {2:<6}| {3:<6}| {4:<15}|".format("id","name","age","sex","classid"))
                print("+{0:<6}+ {1:<15}+ {2:<6}+ {3:<6}+ {4:<15}+".format("-"*6,"-"*15,"-"*6,"-"*6,"-"*15))
                
                # 获取所有学生清单
                stu_list = self.cursor.fetchall()
                for stu_data in stu_list:
                    print("|{0:<6}| {1:<15}| {2:<6}| {3:<6}| {4:<15}|".format(stu_data[0],stu_data[1],stu_data[2],stu_data[3],stu_data[4]))
                print("+{0:<6}+ {1:<15}+ {2:<6}+ {3:<6}+ {4:<15}+".format("-"*6,"-"*15,"-"*6,"-"*6,"-"*15))

        except Exception as error_info:
            print("SQL执行错误！原因：", error_info)

    # 删除指定id的学生信息
    def delete(self, id):
        # 删除学生信息SQL语句
        sql = "delete from stu where id=%d"%(id)
        try:
            # 执行删除学生信息SQL语句
            self.cursor.execute(sql)
            self.db.commit()
            print("="*20,"删除学生信息{:>2}条".format(self.cursor.rowcount),"="*20)
        except Exception as error_info:
            # 事务回滚
            self.db.rollback()
            print("SQL执行错误！原因：", error_info)

    # 添加学生信息
    def insert(self, data):
        # 添加学生信息SQL语句
        sql = "insert into stu(name,age,sex,classid) values('%s',%d,'%s','%s')"%(data)
        try:
            # 执行添加学生信息SQL语句
            self.cursor.execute(sql)
            self.db.commit()
            print("="*20,"添加学生信息{:>2}条".format(self.cursor.rowcount),"="*20)
        except Exception as error_info:
            # 事务回滚
            self.db.rollback()
            print("SQL执行错误！原因：", error_info)
            

while True:
    # 输出初始界面
    print("="*20,"在线学生管理系统","="*20)
    print("{0:1} {1:18} {2:20}".format(" ","1. 查看学生信息","2. 添加学生信息"))
    print("{0:1} {1:18} {2:20}".format(" ","3. 删除学生信息","4. 退出系统"))
    print("="*58)

    # 创建学生信息对象
    stu_info = Stu_Info()
    key = input("请输入对应的选择：")
    # 根据键盘值，判断并执行对应的操作
    if key == "1":                          #1. 查看学生信息
        print("="*22,"学生信息浏览","="*22)
        stu_info.findAll()
        input("按任意键继续：")

    elif key == "2":                        #2. 添加学生信息
        print("="*22,"学生信息添加","="*22)
        stu_rec=[]
        stu_rec.append(input("请输入要添加的学生姓名："))
        try:
            # 获取输入的学生年龄
            stu_rec.append(int(input("请输入要添加的学生年龄：")))
        except ValueError:
            # 输入非法数值
            print("="*20,"无效的学生年龄！","="*20)
            input("按任意键继续：")
            continue
        stu_rec.append(input("请输入要添加的学生性别（w/m）："))
        stu_rec.append(input("请输入要添加的班级号："))
        stu_info.insert(tuple(stu_rec))
        stu_info.findAll()
        input("按任意键继续：")
        
    elif key == "3":                        #3. 删除学生信息
        print("="*22,"学生信息删除","="*22)
        stu_info.findAll()
        try:
            sid = int(input("请输入你要删除的学生id号："))
        except ValueError:
            # 输入非法数值
            print("="*20,"无效的学生id号！","="*20)
            input("按任意键继续：")
            continue
        stu_info.delete(sid)
        stu_info.findAll()
        input("按任意键继续：")
        
    elif key == "4":                        #4. 退出系统
        print("="*26,"再见","="*26)
        break
    
    else:
        print("="*20,"无效的键盘输入！","="*20)
    
